/*
 * Shape.h
 *
 *      Author: Jerome RD Soine and Christoph A Brand
 *      Institution: Schwarz goup, Institute for Theoretical Physics, Heidelberg University, Germany
 */

#ifndef SHAPE_H_
#define SHAPE_H_

#include <vector>
#include <string>

using namespace std;

/*!
 *  \brief Super class for the definition of two-dimensional shapes.
 *
 *  This class provides a basis for the definition of two-dimensional shapes like Ellipse, Circle, Rectangle etc.
 *  It requires basic functions for determining if a ceratin point is located within the shape, the shape area, and
 *  location of shape center.
 */

class Shape {
public:
	/*!
	 * Object Deconstructor.
	 */
	virtual ~Shape() {};
	/*!
	 * Returns true if a point is located within the Shape.
	 */
	virtual bool is_on_shape(vector<double> point) = 0;
	/*!
	 * Returns the area of the Shape.
	 */
	virtual double get_area() = 0;
	/*!
	 * Return the center position of the Shape
	 */
	virtual vector<double> get_center() = 0;
	/*!
	 * Returns angular orientation with respect to cartesian coordinate system.
	 * Returns -1 if no shape has no orientation e.g. Circles.
	 */
	virtual double get_orientation_angle() {return -1;};
	/*!
	 * Returns radius if shape has one.
	 */
	virtual double get_radius() {return 0.0;};


	static const unsigned int TYPE_ELLIPSE = 0;
	static const unsigned int TYPE_RECTANGLE = 1;
	static const unsigned int TYPE_CIRCLE = 2;
	static const unsigned int TYPE_SQUARE = 3;

};


#endif /* SHAPE_H_ */
